dnd: Make the drag gesture obey the button mask specified
authorCarlos Garnacho <carlosg@gnome.org>
Thu, 4 Sep 2014 11:23:26 +0000 (13:23 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 4 Sep 2014 12:59:08 +0000 (14:59 +0200)
This was forgotten when making DnD use a GtkGesture in the handlers
attached to the widget in gtk_drag_source_set(). The gesture must obey
the specified button mask, and switch to denied state if the pressed
button isn't part of the given mask.

https://bugzilla.gnome.org/show_bug.cgi?id=735965

gtk/gtkdnd.c

index 6fabf684200dd3dd1235e1dac7631d04791bcdd5..8a100fdc17bad7d0c9e194cf24dcd187b1a83a3c 100644 (file)
@@ -250,6 +250,9 @@ static void gtk_drag_cancel                    (GtkDragSourceInfo *info,
                                                 GtkDragResult      result,
                                                 guint32            time);
 
+static void gtk_drag_source_gesture_begin      (GtkGesture       *gesture,
+                                                GdkEventSequence *sequence,
+                                                gpointer          data);
 static gboolean gtk_drag_source_event_cb       (GtkWidget         *widget,
                                                 GdkEvent          *event,
                                                 gpointer           data);
@@ -2783,6 +2786,9 @@ gtk_drag_source_set (GtkWidget            *widget,
       gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (site->drag_gesture),
                                                   GTK_PHASE_NONE);
       gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (site->drag_gesture), 0);
+      g_signal_connect (site->drag_gesture, "begin",
+                        G_CALLBACK (gtk_drag_source_gesture_begin),
+                        site);
 
       g_signal_connect (widget, "button-press-event",
                         G_CALLBACK (gtk_drag_source_event_cb),
@@ -3867,6 +3873,23 @@ gtk_drag_drop (GtkDragSourceInfo *info,
 /*
  * Source side callbacks.
  */
+static void
+gtk_drag_source_gesture_begin (GtkGesture       *gesture,
+                               GdkEventSequence *sequence,
+                               gpointer          data)
+{
+  GtkDragSourceSite *site = data;
+  guint button;
+
+  if (gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)))
+    button = 1;
+  else
+    button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+
+  if (!site->start_button_mask ||
+      !(site->start_button_mask & (GDK_BUTTON1_MASK << (button - 1))))
+    gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
+}
 
 static gboolean
 gtk_drag_source_event_cb (GtkWidget *widget,